# test_sv_simple
8.4.24
Простой пример SystemVerilog из головы от Bogdan @esynr3z
# Вариант 1. Без main.cpp
Вот простой пример с которого можно начать и дальше накручивать сложность.
Берем простой верилог из головы:
```verilog
cat > sim_test2.sv <<EOF
module test;
  logic clk;
  always #5 clk = ~clk;

  initial begin
    byte a;
    byte b;
    repeat(8) begin
      @(posedge clk);
      a = byte'($random());
      b = byte'($random());
      \$display("a=%0h b=%0h time %0t", a, b, \$time);
    end
    \$finish();
  end
endmodule
EOF
```
Это первоначальный тест для того, чтобы посмотреть, что всё работает как надо.
Запустить его модно командой
```shell
$ make sim && make run
```
В sim_test2.sv добавил
```verilog
   initial begin

      byte a;
      byte b;
      $dumpfile("out.vcd");
      $dumpvars();
```
Кроме того, verilator поругался на
```verilog
   always #5 clk = ~clk;
```
Заменил = на <=
```verilog
   always #5 clk < = ~clk;
```
Ругаться перестал.
## Как собрать
Собирается следующей командой
```shell
$ verilator --timing --trace --binary --main sim_test.sv
```
Добавил Makefile.
Теперь тоже самое можно собрать так:
```shell
$ make sim
$ make run
```
Исполнить можно и так:
```shell
$ obj_dir/Vsim_test
a=c4 b=9c time 5000
a=2 b=e4 time 15000
a=78 b=bc time 25000
a=b6 b=e4 time 35000
a=b7 b=53 time 45000
a=21 b=e1 time 55000
a=c5 b=82 time 65000
a=62 b=35 time 75000
- sim_test.sv:19: Verilog $finish
```
## Эрюры
Смотрим эпюры
```shell
$ gtkwave out.vcd
```
<img src="doc/fig/sim_test.png" width="200" height="50"/>

## IEEE Std 1800™-2012 SVL п.п.16.4.2
Тест приведён в IEEE Std 1800™-2012 SVL п.п.16.4.2
Показывает поведение 
- наблюдаемого отложенного утверждения a1:
- окончательного отложенного утверждения a2:

```verilog
/* verilator lint_off DECLFILENAME */
/* verilator lint_off UNUSEDSIGNAL */
/* verilator lint_off BLKSEQ */

`timescale 1ns/1ps
module dut(input logic clk, input logic a, input logic b);
   logic c;
   reg [3:0] cnt=0; // считаем ##10
   
   always_ff @(posedge clk)begin
     c <= b;
     if(cnt<10) cnt <= cnt + 1;
     else       cnt <= 0;
     
     $display(" num %d t=%t", cnt, $time);
   end

   a1: assert #0 (!(a & c)) $display("a1:Pass: a=%d c=%d b=%d",a,c,b); 
       else $display("a1:Fail: a=%d c=%d b=%d",a,c,b);
   a2: assert final (!(a & c)) $display("a2:Pass: a=%d c=%d b=%d",a,c,b); 
       else $display("a2:Fail: a=%d c=%d b=%d",a,c,b);

endmodule

program tb(input logic clk, output logic a, output logic b);
  default clocking m @(posedge clk);
  default input #0;
  default output #0;
  output a;
  output b;
  endclocking
  initial begin
      $dumpfile("out.vcd");
      $dumpvars();

    repeat(4) begin
      a = 1;
      b = 0;
      ##10;
      b = 1;
      ##1;
      a = 0;
    end
    $finish();
  end
endprogram

module sim_test;
   bit clk;
   logic a, b;
   
   always #5 clk <= ~clk;
   dut dut(.*);
   tb tb(.*);
            
endmodule
```
В 11-м такте наблюдаемое отложенное утверждение a1 сначала выполнится в активной области, и оно завершится неудачей, поскольку в этот момент a и c оба равны 1. Этот ожидающий отчет об утверждении созреет в наблюдаемой области, и отчет об ошибке будет иметь вид запланировано в реактивном регионе. Однако в реактивной области того же временного шага тестовый стенд установит значение a в 0, запуская еще одно выполнение подразумеваемого блока always_comb, содержащего утверждение a1. На этот раз а1 пройдет. Таким образом, в течение этого временного шага для a1 будут отображаться как сообщение о прохождении, так и о сбое.

Для окончательного отложенного утверждения a2 поведение будет другим. Как и
в случае с a1, отчет об ожидающем утверждении будет создан, если утверждение не удастся в активной области. Однако когда значение изменения в области Reactive и неявное значение always_comb утверждения возобновляется, это создает точку сброса, поэтому этот ожидающий отчет будет сброшен. a2 будет выполнен снова с новым значением, и новый результат будет помещен в очередь отчетов об отложенном утверждении. В регионе «Отложенное» это созреет, и окончательный результат этого утверждения будет единственным, о котором будет сообщено.

Для удобства я добавил счетчик cnt. Он отсчитывает 11 тактов.
Тест можно собрать и выполнить командами:
```shell
$ make sim1
$ make run
$ gtkwave out.vcd
```
Вот результат:
```shell
a1:Pass: a=0 c=0 b=0
a2:Pass: a=0 c=0 b=0
a1:Pass: a=0 c=0 b=1
a2:Pass: a=0 c=0 b=1
 num  9 t=               95000
a1:Pass: a=0 c=1 b=1
a2:Pass: a=0 c=1 b=1
a1:Fail: a=1 c=1 b=0
a2:Fail: a=1 c=1 b=0
 num 10 t=              105000
a1:Pass: a=1 c=0 b=0
a2:Pass: a=1 c=0 b=0
a1:Pass: a=0 c=0 b=0
a2:Pass: a=0 c=0 b=0
```
